package com.deer.wms.base.system.service;

import com.deer.wms.base.system.model.Cell.CellInfo;
import com.deer.wms.base.system.model.Cell.CellInfoCriteria;
import com.deer.wms.base.system.model.Cell.CellInfoDto;
import com.deer.wms.busine.tactic.model.Upper.UpperTacticDetailDto;
import com.deer.wms.intercept.common.data.CurrentUser;
import com.deer.wms.project.root.service.SuperService;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @author guo
 * @since 2019/11/27
 */
public interface CellInfoService extends SuperService<CellInfo> {

    /**
     * 获取仓库中系统内置的验收货位
     *
     * @param wareId 仓库ID
     * @return 货位编码
     */
    String getSysAcceptCell(Integer wareId);

    /**
     * 获取仓库中系统内置的集货库位
     *
     * @param wareId 仓库ID
     * @return 货位编码
     */
    String getSysJhCell(Integer wareId);

    /**
     * 按照条件criteria查询
     * @param criteria criteria
     * @return List<CellInfoDto>
     */
    List<CellInfoDto> findList(CellInfoCriteria criteria);

    /**
     * 根据货位组ID查询
     * @param shelfInfoId 货位组ID
     * @return List<CellInfo>
     */
    List<CellInfo> findByShelfInfoId(@Param("shelfInfoId") Integer shelfInfoId);

    /**
     * 根据货位组ID删除
     * @param shelfInfoId 货位组ID
     */
    void deleteByShelfId(@Param("shelfInfoId") Integer shelfInfoId);

    void modifyCellState(@Param("cellCode") String cellCode, @Param("wareId") Integer wareId, String sate, CurrentUser currentUser);

    /**
     * 根据仓库ID和库位编码查询
     * @param cellCode 库位编码
     * @param wareId 仓库ID
     * @return CellInfoDto
     */
    CellInfoDto findByCodeAndWareId(@Param("cellCode") String cellCode, @Param("wareId") Integer wareId);

    /**
     * 根据库位使用类型查询
     * @param criteria criteria
     * @return List<CellInfoDto>
     */
    List<CellInfoDto> findByCellUseTypes(CellInfoCriteria criteria);

    String getNewInCell(Integer wareId);

    /**
     * 根据仓库和库位编码获取类型
     * @param cellCode 库位编码
     * @param wareId 仓库
     * @return Integer
     */
    Integer getCellType(String cellCode, Integer wareId);

    CellInfo findBy(String field, String value);

    /**
     * 根据上架策略获取推荐的库位
     * @param upperTacticDetail 上架策略
     * @return List<CellInfo>
     */
    List<CellInfoDto> getRecommendUpperCells(UpperTacticDetailDto upperTacticDetail);

    List<CellInfoDto> findByWareIdList(CellInfoCriteria criteria);
}
